/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladoresJPA;

import controladoresJPA.exceptions.IllegalOrphanException;
import controladoresJPA.exceptions.NonexistentEntityException;
import controladoresJPA.exceptions.PreexistingEntityException;
import entregapersistencia.*;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author dianacha
 */
public class ProductoJpaController implements Serializable {

    public ProductoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Producto producto) throws PreexistingEntityException, Exception {
        if (producto.getProductoFacturaCollection() == null) {
            producto.setProductoFacturaCollection(new ArrayList<ProductoFactura>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Chaqueta chaqueta = producto.getChaqueta();
            if (chaqueta != null) {
                chaqueta = em.getReference(chaqueta.getClass(), chaqueta.getIdProducto());
                producto.setChaqueta(chaqueta);
            }
            DescuentosProducto descuentosProducto = producto.getDescuentosProducto();
            if (descuentosProducto != null) {
                descuentosProducto = em.getReference(descuentosProducto.getClass(), descuentosProducto.getIdProducto());
                producto.setDescuentosProducto(descuentosProducto);
            }
            Jean jean = producto.getJean();
            if (jean != null) {
                jean = em.getReference(jean.getClass(), jean.getIdProducto());
                producto.setJean(jean);
            }
            DetallesProducto detallesProducto = producto.getDetallesProducto();
            if (detallesProducto != null) {
                detallesProducto = em.getReference(detallesProducto.getClass(), detallesProducto.getIdProducto());
                producto.setDetallesProducto(detallesProducto);
            }
            PreciosProducto preciosProducto = producto.getPreciosProducto();
            if (preciosProducto != null) {
                preciosProducto = em.getReference(preciosProducto.getClass(), preciosProducto.getIdProducto());
                producto.setPreciosProducto(preciosProducto);
            }
            Blusa blusa = producto.getBlusa();
            if (blusa != null) {
                blusa = em.getReference(blusa.getClass(), blusa.getIdProducto());
                producto.setBlusa(blusa);
            }
            Libro libro = producto.getLibro();
            if (libro != null) {
                libro = em.getReference(libro.getClass(), libro.getIdProducto());
                producto.setLibro(libro);
            }
            Brasier brasier = producto.getBrasier();
            if (brasier != null) {
                brasier = em.getReference(brasier.getClass(), brasier.getIdProducto());
                producto.setBrasier(brasier);
            }
            Collection<ProductoFactura> attachedProductoFacturaCollection = new ArrayList<ProductoFactura>();
            for (ProductoFactura productoFacturaCollectionProductoFacturaToAttach : producto.getProductoFacturaCollection()) {
                productoFacturaCollectionProductoFacturaToAttach = em.getReference(productoFacturaCollectionProductoFacturaToAttach.getClass(), productoFacturaCollectionProductoFacturaToAttach.getProductoFacturaPK());
                attachedProductoFacturaCollection.add(productoFacturaCollectionProductoFacturaToAttach);
            }
            producto.setProductoFacturaCollection(attachedProductoFacturaCollection);
            em.persist(producto);
            if (chaqueta != null) {
                Producto oldProductoOfChaqueta = chaqueta.getProducto();
                if (oldProductoOfChaqueta != null) {
                    oldProductoOfChaqueta.setChaqueta(null);
                    oldProductoOfChaqueta = em.merge(oldProductoOfChaqueta);
                }
                chaqueta.setProducto(producto);
                chaqueta = em.merge(chaqueta);
            }
            if (descuentosProducto != null) {
                Producto oldProductoOfDescuentosProducto = descuentosProducto.getProducto();
                if (oldProductoOfDescuentosProducto != null) {
                    oldProductoOfDescuentosProducto.setDescuentosProducto(null);
                    oldProductoOfDescuentosProducto = em.merge(oldProductoOfDescuentosProducto);
                }
                descuentosProducto.setProducto(producto);
                descuentosProducto = em.merge(descuentosProducto);
            }
            if (jean != null) {
                Producto oldProductoOfJean = jean.getProducto();
                if (oldProductoOfJean != null) {
                    oldProductoOfJean.setJean(null);
                    oldProductoOfJean = em.merge(oldProductoOfJean);
                }
                jean.setProducto(producto);
                jean = em.merge(jean);
            }
            if (detallesProducto != null) {
                Producto oldProductoOfDetallesProducto = detallesProducto.getProducto();
                if (oldProductoOfDetallesProducto != null) {
                    oldProductoOfDetallesProducto.setDetallesProducto(null);
                    oldProductoOfDetallesProducto = em.merge(oldProductoOfDetallesProducto);
                }
                detallesProducto.setProducto(producto);
                detallesProducto = em.merge(detallesProducto);
            }
            if (preciosProducto != null) {
                Producto oldProductoOfPreciosProducto = preciosProducto.getProducto();
                if (oldProductoOfPreciosProducto != null) {
                    oldProductoOfPreciosProducto.setPreciosProducto(null);
                    oldProductoOfPreciosProducto = em.merge(oldProductoOfPreciosProducto);
                }
                preciosProducto.setProducto(producto);
                preciosProducto = em.merge(preciosProducto);
            }
            if (blusa != null) {
                Producto oldProductoOfBlusa = blusa.getProducto();
                if (oldProductoOfBlusa != null) {
                    oldProductoOfBlusa.setBlusa(null);
                    oldProductoOfBlusa = em.merge(oldProductoOfBlusa);
                }
                blusa.setProducto(producto);
                blusa = em.merge(blusa);
            }
            if (libro != null) {
                Producto oldProductoOfLibro = libro.getProducto();
                if (oldProductoOfLibro != null) {
                    oldProductoOfLibro.setLibro(null);
                    oldProductoOfLibro = em.merge(oldProductoOfLibro);
                }
                libro.setProducto(producto);
                libro = em.merge(libro);
            }
            if (brasier != null) {
                Producto oldProductoOfBrasier = brasier.getProducto();
                if (oldProductoOfBrasier != null) {
                    oldProductoOfBrasier.setBrasier(null);
                    oldProductoOfBrasier = em.merge(oldProductoOfBrasier);
                }
                brasier.setProducto(producto);
                brasier = em.merge(brasier);
            }
            for (ProductoFactura productoFacturaCollectionProductoFactura : producto.getProductoFacturaCollection()) {
                Producto oldProductoOfProductoFacturaCollectionProductoFactura = productoFacturaCollectionProductoFactura.getProducto();
                productoFacturaCollectionProductoFactura.setProducto(producto);
                productoFacturaCollectionProductoFactura = em.merge(productoFacturaCollectionProductoFactura);
                if (oldProductoOfProductoFacturaCollectionProductoFactura != null) {
                    oldProductoOfProductoFacturaCollectionProductoFactura.getProductoFacturaCollection().remove(productoFacturaCollectionProductoFactura);
                    oldProductoOfProductoFacturaCollectionProductoFactura = em.merge(oldProductoOfProductoFacturaCollectionProductoFactura);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findProducto(producto.getCodigo()) != null) {
                throw new PreexistingEntityException("Producto " + producto + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Producto producto) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto persistentProducto = em.find(Producto.class, producto.getCodigo());
            Chaqueta chaquetaOld = persistentProducto.getChaqueta();
            Chaqueta chaquetaNew = producto.getChaqueta();
            DescuentosProducto descuentosProductoOld = persistentProducto.getDescuentosProducto();
            DescuentosProducto descuentosProductoNew = producto.getDescuentosProducto();
            Jean jeanOld = persistentProducto.getJean();
            Jean jeanNew = producto.getJean();
            DetallesProducto detallesProductoOld = persistentProducto.getDetallesProducto();
            DetallesProducto detallesProductoNew = producto.getDetallesProducto();
            PreciosProducto preciosProductoOld = persistentProducto.getPreciosProducto();
            PreciosProducto preciosProductoNew = producto.getPreciosProducto();
            Blusa blusaOld = persistentProducto.getBlusa();
            Blusa blusaNew = producto.getBlusa();
            Libro libroOld = persistentProducto.getLibro();
            Libro libroNew = producto.getLibro();
            Brasier brasierOld = persistentProducto.getBrasier();
            Brasier brasierNew = producto.getBrasier();
            Collection<ProductoFactura> productoFacturaCollectionOld = persistentProducto.getProductoFacturaCollection();
            Collection<ProductoFactura> productoFacturaCollectionNew = producto.getProductoFacturaCollection();
            List<String> illegalOrphanMessages = null;
            if (chaquetaOld != null && !chaquetaOld.equals(chaquetaNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Chaqueta " + chaquetaOld + " since its producto field is not nullable.");
            }
            if (descuentosProductoOld != null && !descuentosProductoOld.equals(descuentosProductoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain DescuentosProducto " + descuentosProductoOld + " since its producto field is not nullable.");
            }
            if (jeanOld != null && !jeanOld.equals(jeanNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Jean " + jeanOld + " since its producto field is not nullable.");
            }
            if (detallesProductoOld != null && !detallesProductoOld.equals(detallesProductoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain DetallesProducto " + detallesProductoOld + " since its producto field is not nullable.");
            }
            if (preciosProductoOld != null && !preciosProductoOld.equals(preciosProductoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain PreciosProducto " + preciosProductoOld + " since its producto field is not nullable.");
            }
            if (blusaOld != null && !blusaOld.equals(blusaNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Blusa " + blusaOld + " since its producto field is not nullable.");
            }
            if (libroOld != null && !libroOld.equals(libroNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Libro " + libroOld + " since its producto field is not nullable.");
            }
            if (brasierOld != null && !brasierOld.equals(brasierNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Brasier " + brasierOld + " since its producto field is not nullable.");
            }
            for (ProductoFactura productoFacturaCollectionOldProductoFactura : productoFacturaCollectionOld) {
                if (!productoFacturaCollectionNew.contains(productoFacturaCollectionOldProductoFactura)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProductoFactura " + productoFacturaCollectionOldProductoFactura + " since its producto field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (chaquetaNew != null) {
                chaquetaNew = em.getReference(chaquetaNew.getClass(), chaquetaNew.getIdProducto());
                producto.setChaqueta(chaquetaNew);
            }
            if (descuentosProductoNew != null) {
                descuentosProductoNew = em.getReference(descuentosProductoNew.getClass(), descuentosProductoNew.getIdProducto());
                producto.setDescuentosProducto(descuentosProductoNew);
            }
            if (jeanNew != null) {
                jeanNew = em.getReference(jeanNew.getClass(), jeanNew.getIdProducto());
                producto.setJean(jeanNew);
            }
            if (detallesProductoNew != null) {
                detallesProductoNew = em.getReference(detallesProductoNew.getClass(), detallesProductoNew.getIdProducto());
                producto.setDetallesProducto(detallesProductoNew);
            }
            if (preciosProductoNew != null) {
                preciosProductoNew = em.getReference(preciosProductoNew.getClass(), preciosProductoNew.getIdProducto());
                producto.setPreciosProducto(preciosProductoNew);
            }
            if (blusaNew != null) {
                blusaNew = em.getReference(blusaNew.getClass(), blusaNew.getIdProducto());
                producto.setBlusa(blusaNew);
            }
            if (libroNew != null) {
                libroNew = em.getReference(libroNew.getClass(), libroNew.getIdProducto());
                producto.setLibro(libroNew);
            }
            if (brasierNew != null) {
                brasierNew = em.getReference(brasierNew.getClass(), brasierNew.getIdProducto());
                producto.setBrasier(brasierNew);
            }
            Collection<ProductoFactura> attachedProductoFacturaCollectionNew = new ArrayList<ProductoFactura>();
            for (ProductoFactura productoFacturaCollectionNewProductoFacturaToAttach : productoFacturaCollectionNew) {
                productoFacturaCollectionNewProductoFacturaToAttach = em.getReference(productoFacturaCollectionNewProductoFacturaToAttach.getClass(), productoFacturaCollectionNewProductoFacturaToAttach.getProductoFacturaPK());
                attachedProductoFacturaCollectionNew.add(productoFacturaCollectionNewProductoFacturaToAttach);
            }
            productoFacturaCollectionNew = attachedProductoFacturaCollectionNew;
            producto.setProductoFacturaCollection(productoFacturaCollectionNew);
            producto = em.merge(producto);
            if (chaquetaNew != null && !chaquetaNew.equals(chaquetaOld)) {
                Producto oldProductoOfChaqueta = chaquetaNew.getProducto();
                if (oldProductoOfChaqueta != null) {
                    oldProductoOfChaqueta.setChaqueta(null);
                    oldProductoOfChaqueta = em.merge(oldProductoOfChaqueta);
                }
                chaquetaNew.setProducto(producto);
                chaquetaNew = em.merge(chaquetaNew);
            }
            if (descuentosProductoNew != null && !descuentosProductoNew.equals(descuentosProductoOld)) {
                Producto oldProductoOfDescuentosProducto = descuentosProductoNew.getProducto();
                if (oldProductoOfDescuentosProducto != null) {
                    oldProductoOfDescuentosProducto.setDescuentosProducto(null);
                    oldProductoOfDescuentosProducto = em.merge(oldProductoOfDescuentosProducto);
                }
                descuentosProductoNew.setProducto(producto);
                descuentosProductoNew = em.merge(descuentosProductoNew);
            }
            if (jeanNew != null && !jeanNew.equals(jeanOld)) {
                Producto oldProductoOfJean = jeanNew.getProducto();
                if (oldProductoOfJean != null) {
                    oldProductoOfJean.setJean(null);
                    oldProductoOfJean = em.merge(oldProductoOfJean);
                }
                jeanNew.setProducto(producto);
                jeanNew = em.merge(jeanNew);
            }
            if (detallesProductoNew != null && !detallesProductoNew.equals(detallesProductoOld)) {
                Producto oldProductoOfDetallesProducto = detallesProductoNew.getProducto();
                if (oldProductoOfDetallesProducto != null) {
                    oldProductoOfDetallesProducto.setDetallesProducto(null);
                    oldProductoOfDetallesProducto = em.merge(oldProductoOfDetallesProducto);
                }
                detallesProductoNew.setProducto(producto);
                detallesProductoNew = em.merge(detallesProductoNew);
            }
            if (preciosProductoNew != null && !preciosProductoNew.equals(preciosProductoOld)) {
                Producto oldProductoOfPreciosProducto = preciosProductoNew.getProducto();
                if (oldProductoOfPreciosProducto != null) {
                    oldProductoOfPreciosProducto.setPreciosProducto(null);
                    oldProductoOfPreciosProducto = em.merge(oldProductoOfPreciosProducto);
                }
                preciosProductoNew.setProducto(producto);
                preciosProductoNew = em.merge(preciosProductoNew);
            }
            if (blusaNew != null && !blusaNew.equals(blusaOld)) {
                Producto oldProductoOfBlusa = blusaNew.getProducto();
                if (oldProductoOfBlusa != null) {
                    oldProductoOfBlusa.setBlusa(null);
                    oldProductoOfBlusa = em.merge(oldProductoOfBlusa);
                }
                blusaNew.setProducto(producto);
                blusaNew = em.merge(blusaNew);
            }
            if (libroNew != null && !libroNew.equals(libroOld)) {
                Producto oldProductoOfLibro = libroNew.getProducto();
                if (oldProductoOfLibro != null) {
                    oldProductoOfLibro.setLibro(null);
                    oldProductoOfLibro = em.merge(oldProductoOfLibro);
                }
                libroNew.setProducto(producto);
                libroNew = em.merge(libroNew);
            }
            if (brasierNew != null && !brasierNew.equals(brasierOld)) {
                Producto oldProductoOfBrasier = brasierNew.getProducto();
                if (oldProductoOfBrasier != null) {
                    oldProductoOfBrasier.setBrasier(null);
                    oldProductoOfBrasier = em.merge(oldProductoOfBrasier);
                }
                brasierNew.setProducto(producto);
                brasierNew = em.merge(brasierNew);
            }
            for (ProductoFactura productoFacturaCollectionNewProductoFactura : productoFacturaCollectionNew) {
                if (!productoFacturaCollectionOld.contains(productoFacturaCollectionNewProductoFactura)) {
                    Producto oldProductoOfProductoFacturaCollectionNewProductoFactura = productoFacturaCollectionNewProductoFactura.getProducto();
                    productoFacturaCollectionNewProductoFactura.setProducto(producto);
                    productoFacturaCollectionNewProductoFactura = em.merge(productoFacturaCollectionNewProductoFactura);
                    if (oldProductoOfProductoFacturaCollectionNewProductoFactura != null && !oldProductoOfProductoFacturaCollectionNewProductoFactura.equals(producto)) {
                        oldProductoOfProductoFacturaCollectionNewProductoFactura.getProductoFacturaCollection().remove(productoFacturaCollectionNewProductoFactura);
                        oldProductoOfProductoFacturaCollectionNewProductoFactura = em.merge(oldProductoOfProductoFacturaCollectionNewProductoFactura);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = producto.getCodigo();
                if (findProducto(id) == null) {
                    throw new NonexistentEntityException("The producto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto producto;
            try {
                producto = em.getReference(Producto.class, id);
                producto.getCodigo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The producto with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Chaqueta chaquetaOrphanCheck = producto.getChaqueta();
            if (chaquetaOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Chaqueta " + chaquetaOrphanCheck + " in its chaqueta field has a non-nullable producto field.");
            }
            DescuentosProducto descuentosProductoOrphanCheck = producto.getDescuentosProducto();
            if (descuentosProductoOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the DescuentosProducto " + descuentosProductoOrphanCheck + " in its descuentosProducto field has a non-nullable producto field.");
            }
            Jean jeanOrphanCheck = producto.getJean();
            if (jeanOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Jean " + jeanOrphanCheck + " in its jean field has a non-nullable producto field.");
            }
            DetallesProducto detallesProductoOrphanCheck = producto.getDetallesProducto();
            if (detallesProductoOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the DetallesProducto " + detallesProductoOrphanCheck + " in its detallesProducto field has a non-nullable producto field.");
            }
            PreciosProducto preciosProductoOrphanCheck = producto.getPreciosProducto();
            if (preciosProductoOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the PreciosProducto " + preciosProductoOrphanCheck + " in its preciosProducto field has a non-nullable producto field.");
            }
            Blusa blusaOrphanCheck = producto.getBlusa();
            if (blusaOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Blusa " + blusaOrphanCheck + " in its blusa field has a non-nullable producto field.");
            }
            Libro libroOrphanCheck = producto.getLibro();
            if (libroOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Libro " + libroOrphanCheck + " in its libro field has a non-nullable producto field.");
            }
            Brasier brasierOrphanCheck = producto.getBrasier();
            if (brasierOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Brasier " + brasierOrphanCheck + " in its brasier field has a non-nullable producto field.");
            }
            Collection<ProductoFactura> productoFacturaCollectionOrphanCheck = producto.getProductoFacturaCollection();
            for (ProductoFactura productoFacturaCollectionOrphanCheckProductoFactura : productoFacturaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the ProductoFactura " + productoFacturaCollectionOrphanCheckProductoFactura + " in its productoFacturaCollection field has a non-nullable producto field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(producto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Producto> findProductoEntities() {
        return findProductoEntities(true, -1, -1);
    }

    public List<Producto> findProductoEntities(int maxResults, int firstResult) {
        return findProductoEntities(false, maxResults, firstResult);
    }

    private List<Producto> findProductoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Producto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Producto findProducto(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Producto.class, id);
        } finally {
            em.close();
        }
    }

    public int getProductoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Producto> rt = cq.from(Producto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
